Functional Programming Principles In Scala